from datetime import datetime, timedelta, time
from config_loader import load_config
from service.handler import send_text_msg_qx, mysql_db, get_alarms_from_db, \
    get_sign_in_alarms, PREFIX_STR, weekday_dict, send_to_server_chan

# 加载配置
cfg = load_config("config.yml")
SERVER_CHAN_KEY = cfg["SERVER_CHAN_KEY"]
ROBOT_WXID = cfg["ROBOT_WXID"]
TO_WXID = cfg["TO_WXID"]


############################################ 打卡定时任务 ############################################
def alarms_task_today():
    # 获取今天的日期和星期
    today = datetime.now()
    weekday = '每周' + weekday_dict[today.strftime('%A')]
    date = '每月' + today.strftime('%d') + '号'
    # 获取当前时间
    now = datetime.now()
    # 计算当前时间到第二天00:00的秒数
    # seconds_to_midnight = (datetime.combine(now.date() + timedelta(days=1), time(0)) - now).total_seconds()
    # 从数据库中获取所有打卡类型的事件,获取接下来5分钟内需要推送消息的闹钟事件
    conn = mysql_db()
    alarms = get_sign_in_alarms(conn)
    # 否则，收集所有的闹钟事件
    alarms_str = []
    # 在开头添加一个大标题
    alarms_str.append('😂😂😂今日打卡😂😂😂' + chr(13) + PREFIX_STR + chr(13))
    for alarm in alarms:
        # 检查当前时间是否在闹钟时间前的5分钟，并且当前日期在闹钟的开始日期和结束日期之间
        start_date_obj = datetime.strptime(alarm[1], '%m月%d日').date().replace(year=2023)
        end_date_obj = datetime.strptime(alarm[2], '%m月%d日').date().replace(year=2023)
        if start_date_obj <= now.date() <= end_date_obj:
            if alarm[4] == '每天' or alarm[4] == weekday or alarm[4] == date:
                # 将每个闹钟的信息分别添加到列表中
                alarm_info = f"【{alarm[8]}】{alarm[5]}" + chr(13) + f"【内容】{alarm[6]}" + chr(
                    13) + f"【直达】{alarm[7]}" + chr(13) + PREFIX_STR + chr(13)
                alarms_str.append(alarm_info)
            else:
                continue
        else:
            continue
    # 使用join()函数，将列表中的每个元素连接成一个字符串，每个元素之间用换行符分隔
    response = ''.join(alarms_str)
    if len(alarms_str) > 1:
        # 发送结果给用户
        # send_text_msg(ROBOT_WXID, TO_WXID, response)

        # server酱推送
        send_to_server_chan(SERVER_CHAN_KEY, "今日打卡", response)
    else:
        print('今天没有打卡任务要做！')


############################################ 抢购定时任务 ############################################
# 抢购定时任务【用于抢购提醒消息推送】
def task_alarms_purchase_qx():
    # 获取当前时间和星期、月份信息
    now = datetime.now()
    weekday = '每周' + weekday_dict[now.strftime('%A')]
    date = '每月' + now.strftime('%d') + '号'
    # 从数据库中获取所有闹钟,获取接下来5分钟内需要推送消息的闹钟事件
    conn = mysql_db()
    alarms = get_alarms_from_db(conn)
    print('alarms=', alarms)
    for alarm in alarms:
        # 将闹钟的时间（当天的秒数）转换为具体的时间
        alarm_time = datetime.combine(now.date(), time(0)) + timedelta(seconds=alarm[3])
        # 检查当前时间是否在闹钟时间前的5分钟，并且当前日期在闹钟的开始日期和结束日期之间
        start_date_obj = datetime.strptime(alarm[1], '%m月%d日').date().replace(year=2023)
        end_date_obj = datetime.strptime(alarm[2], '%m月%d日').date().replace(year=2023)
        alarmed_time = datetime.strptime(alarm[6], '%Y-%m-%d %H:%M:%S') if alarm[6] else None
        if alarm[3] == '0':
            alarm_date = now.date() + timedelta(days=1)
        else:
            alarm_date = now.date()
        if 0 <= (alarm_time - now).total_seconds() <= 300 and start_date_obj <= alarm_date <= end_date_obj:
            frequency = alarm[4]
            if frequency == '每天' or frequency == weekday or frequency == date:
                # 如果在5分钟内，但是alarm_time字段日期为今日，说明今天已经推送过，不再推送，执行下一个alarm
                if not alarmed_time or alarmed_time.date() != now.date():
                    print("Sending reminder for alarm:", alarm[4])
                    # 发送提示消息
                    send_text_msg_qx(ROBOT_WXID, TO_WXID, '闹钟提醒：' + alarm[4])
                    # 更新alarmed_time为当前的时间
                    cur = conn.cursor()
                    cur.execute("UPDATE alarms SET alarmed_time = %s WHERE id = %s",
                                (now.strftime('%Y-%m-%d %H:%M:%S'), alarm[0]))
                    conn.commit()
        else:
            print('此次定时任务没有需要推送消息的事件')


############################################ 明日定时任务提醒【明日打卡提醒】############################################
def alarms_task_tomorrow():
    print("打卡闹钟定时任务已开启......")
    # 获取明天的日期和星期
    tomorrow = datetime.now() + timedelta(days=1)
    weekday_tomorrow = '每周' + weekday_dict[tomorrow.strftime('%A')]
    date_tomorrow = '每月' + tomorrow.strftime('%d') + '号'
    # 获取当前时间
    now = datetime.now()
    # 计算当前时间到第二天00:00的秒数
    seconds_to_midnight = (datetime.combine(now.date() + timedelta(days=1), time(0)) - now).total_seconds()
    # 从数据库中获取所有打卡类型的事件,获取接下来5分钟内需要推送消息的闹钟事件
    conn = mysql_db()
    alarms = get_sign_in_alarms(conn)
    print('alarms=', alarms)
    # 否则，收集所有的闹钟事件
    alarms_str = []
    # 在开头添加一个大标题
    alarms_str.append('😘😘😘明日打卡预告😘😘😘' + chr(13) + PREFIX_STR + chr(13))
    for alarm in alarms:
        # 将闹钟的时间（当天的秒数）转换为具体的时间
        # alarm_time = datetime.combine(now.date(), time(0)) + timedelta(seconds=alarm[3])
        # 检查当前时间是否在闹钟时间前的5分钟，并且当前日期在闹钟的开始日期和结束日期之间
        start_date_obj = datetime.strptime(alarm[1], '%m月%d日').date().replace(year=2023)
        end_date_obj = datetime.strptime(alarm[2], '%m月%d日').date().replace(year=2023)
        alarm_date = now.date() + timedelta(days=1)
        if start_date_obj <= alarm_date <= end_date_obj:
            if alarm[4] == '每天' or alarm[4] == weekday_tomorrow or alarm[4] == date_tomorrow:
                # 将每个闹钟的信息分别添加到列表中
                alarm_info = f"【{alarm[8]}】{alarm[5]}" + chr(13) + f"【内容】{alarm[6]}" + chr(
                    13) + f"【直达】{alarm[7]}" + chr(
                    13) + PREFIX_STR + chr(13)
                alarms_str.append(alarm_info)
            else:
                continue
        else:
            continue
    # 使用join()函数，将列表中的每个元素连接成一个字符串，每个元素之间用换行符分隔
    response = ''.join(alarms_str)
    if len(alarms_str) > 1:
        # 发送结果给用户(千寻微信框架推送)
        # send_text_msg(ROBOT_WXID, TO_WXID, response)

        # server酱推送
        send_to_server_chan(SERVER_CHAN_KEY, "Today ToDoList", response)
    else:
        print('明日没有打卡任务要做！')
